#include "head.h"

// 菜单信息 - 登陆用
const wchar_t *title = L"普通用户菜单";
const wchar_t *option_1[] = {L"登录", L"注册", L"返回"};
const wchar_t *title_2 = L"用户购票退票";
const wchar_t *option_2[] = {L"购票", L"退票", L"返回"};
const wchar_t *title_3 = L"设定航班";
const wchar_t *option_3[] = {L"添加航班", L"删除航班", L"设定航班起飞", L"设定航班降落", L"退出设定航班"};

// 菜单信息 - 管理员用
const wchar_t *title_root = L"管理员用户菜单";
const wchar_t *option_root[] = {
    L"设定航班",
    L"修改航班",
    L"修改普通用户",
    L"增加超级用户",
    L"退出系统"};

// 菜单信息 - 普通用户用
const wchar_t *title_user = L"用户菜单";
const wchar_t *option_user[] = {
    L"购票退票",
    L"余额充值",
    L"查看航班",
    L"修改密码",
    L"我的订单",
    L"退出系统"};

// 系统初始化
FlightSystem Sys_init(void)
{
    FlightSystem Flight_sys;
    Flight_sys.Flight_list = D_List_init();   // 航班信息
    Flight_sys.ADMIN_USER = S_List_init();    // 管理员账户信息
    Flight_sys.REGULAR_USER = S_List_init();  // 普通用户信息
    Flight_sys.SILVER_USER = S_List_init();   // 银卡会员信息 (9折)
    Flight_sys.GOLD_USER = S_List_init();     // 金卡会员信息 (8折)
    Flight_sys.PLATINUM_USER = S_List_init(); // 白金会员信息 (7折)

    // 从文件中导入数据
    D_List_file_scanf(Flight_sys.Flight_list);                  // 航班信息
    S_List_File_scanf(Flight_sys.ADMIN_USER, ADMIN_FILE);       // 管理员账户信息文件
    S_List_File_scanf(Flight_sys.REGULAR_USER, REGULAR_FILE);   // 普通用户信息文件
    S_List_File_scanf(Flight_sys.SILVER_USER, SILVER_FILE);     // 银卡会员信息文件 (9折)
    S_List_File_scanf(Flight_sys.GOLD_USER, GOLD_FILE);         // 金卡会员信息文件 (8折)
    S_List_File_scanf(Flight_sys.PLATINUM_USER, PLATINUM_FILE); // 白金会员信息文件 (7折)

    system("clear");
    return Flight_sys;
}

// 系统注册登录
U_data Sys_log_in(FlightSystem Flight_sys)
{
    // 用户信息合表
    U_list *list = S_List_init();
    list = S_List_merge(list, Flight_sys.ADMIN_USER);    // 管理员账户信息文件
    list = S_List_merge(list, Flight_sys.REGULAR_USER);  // 普通用户信息文件
    list = S_List_merge(list, Flight_sys.SILVER_USER);   // 银卡会员信息文件 (9折)
    list = S_List_merge(list, Flight_sys.GOLD_USER);     // 金卡会员信息文件 (8折)
    list = S_List_merge(list, Flight_sys.PLATINUM_USER); // 白金会员信息文件 (7折)

    // 开始注册登录
    int flag = 0;
    U_data log_data;
    flag = display_menu(title, option_1, 3);

    // 菜单选项分支处理
    switch (flag)
    {
    case 1:
        // 登录
        system("clear");
        log_data = Log_in(list);
        break;
    case 2:
        // 注册
        system("clear");
        Register(list, Flight_sys);
    case 3:
        exit(-1);
        // 返回
        break;
    default:
        break;
    }
    return log_data;
}

// 系统菜单
void Sys_menu(FlightSystem Flight_Sys, U_data log_data)
{
    // 用户信息合表
    U_list *list = S_List_init();
    list = S_List_merge(list, Flight_Sys.REGULAR_USER);  // 普通用户信息文件
    list = S_List_merge(list, Flight_Sys.SILVER_USER);   // 银卡会员信息文件 (9折)
    list = S_List_merge(list, Flight_Sys.GOLD_USER);     // 金卡会员信息文件 (8折)
    list = S_List_merge(list, Flight_Sys.PLATINUM_USER); // 白金会员信息文件 (7折)
    S_arr_list *L = Init_S_arr_list();
    // 分支
    int flag = 0;
    while (1)
    {
        switch (log_data.grade)
        {
        case 1: // 管理员功能界面
            flag = display_menu(title_root, option_root, 5);
            break;
        default:
            // 普通用户功能界面
            flag = display_menu(title_user, option_user, 6) + 5;
            break;
        }

        // 菜单选项分支处理
        switch (flag)
        {
        case 1:
            // 管理员 - 设定航班
            system("clear");
            set_flight(Flight_Sys, log_data);
            getchar();
            getchar(); 
            break;
        case 2:
            // 管理员 - 修改航班
            system("clear");
            modify_flight_id(Flight_Sys.Flight_list);
            getchar();
            getchar();
            break;
        case 3:
            // 管理员 - 修改普通用户
            system("clear");
            modify_regular_users(Flight_Sys.REGULAR_USER);
            getchar();
            getchar();
            break;
        case 4:
            // 管理员 - 增加超级用户
            system("clear");
            add_admin(Flight_Sys.ADMIN_USER);
            getchar();
            getchar();
            break;
        case 5:
            exit(-1); // 管理员 - 退出系统
            break;
        case 6:
            system("clear");
            buy_refund_ticket(Flight_Sys, log_data, L);
            // 用户 - 购退票
            break;
        case 7:
            system("clear");
            recharge_USER(Flight_Sys, log_data);
            printf("请按回车继续\n");
            getchar();
            // 用户 - 余额充值
            break;
        case 8:
            system("clear");
            D_List_print(Flight_Sys.Flight_list);
            printf("请按回车继续\n");
            getchar();
            // 用户 - 查看航班
            break;
        case 9:
            system("clear");
            change_password_USER(Flight_Sys, log_data);
            printf("请按回车继续\n");
            getchar();
            getchar();
            // 用户 - 修改密码
            break;
        case 10:
            system("clear");
            my_order(Flight_Sys.Flight_list, log_data, L);
            printf("请按回车继续\n");
            getchar();
            // 用户 - 我的订单
            break;
        case 11:
            exit(-1);
            // 用户 - 退出系统
            break;
        default:
            break;
        }
    }
}
// 购退票选择
void buy_refund_ticket(FlightSystem Flight_Sys, U_data log_data, S_arr_list *L)
{
    int flag = 0;
    flag = display_menu(title_2, option_2, 3);
    switch (flag)
    {
    case 1:
        system("clear");
        // 用户 - 购票
        buy_ticket_USER(Flight_Sys, log_data, L);
        break;
    case 2:
        system("clear");
        // 用户 - 退票
        refund_ticket_USER(Flight_Sys, log_data, L);
        break;
    case 3:
        system("clear");
        return;
    }
}

// 添加航班
void add_flight(F_list *Flight_list)
{
    system("clear");
    printf("=============================================添加航班=============================================\n");
    F_node *ptr = Flight_list->next;
    F_data data; // 航班信息
    int num = 0;
    F_node *temp = Flight_list->next;
    do
    {
        num++;
        temp = temp->next;
    } while (temp != Flight_list->next);

    data.id = num + 1; // 航班班次
    do
    {
        if (data.id == ptr->data.id)
        {
            printf("航班班次已存在，请重新输入。");
            return;
        }
        ptr = ptr->next;
    } while (ptr != Flight_list->next);

    printf("请选择飞机机型：\n\t1. Boeing_737\n\t2. Airbus_A320\n\t3. Boeing_787\n\t4. Airbus_A330\n\t5.Airbus_A350\n");
    int choice;
    scanf("%d", &choice);
    switch (choice)
    {
    case 1:
        strcpy(data.flighttype, "Boeing_737");
        break;
    case 2:
        strcpy(data.flighttype, "Airbus_A320");
        break;
    case 3:
        strcpy(data.flighttype, "Boeing_787");
        break;
    case 4:
        strcpy(data.flighttype, "Airbus_A330");
        break;
    case 5:
        strcpy(data.flighttype, "Airbus_A350");
        break;
    default:
        printf("无效的选择，请重新输入。");
        return;
    }
    printf("请输入航班起点站：");
    scanf("%s", data.startcity);
    printf("请输入航班终点站：");
    scanf("%s", data.arrivecity);
    printf("请输入起飞时间（时：分）：");
    scanf("%02d:%02d", &data.starttime[0], &data.starttime[1]);
    printf("请输入到达时间（时：分）：");
    scanf("%02d:%02d", &data.arrivetime[0], &data.arrivetime[1]);
    printf("请输入飞行时间：");
    scanf("%s", data.flytime);
    printf("请输入票价：");
    scanf("%d", &data.value);
    printf("请输入额定载客量：");
    scanf("%d", &data.maxNUM);
    data.leftbuyersa = 7;
    data.whetherfly = 'n';
     D_List_insert(Flight_list, data,num);
    printf("\t\t添加成功\n");
    // D_List_file_print(Flight_list);
}

// 删除航班
void delete_flight(F_list *Flight_list)
{
    system("clear");
    printf("=============================================删除航班=============================================\n");
    int id;
    printf("请输入要删除的航班班次：");
    scanf("%d", &id);
    F_node *ptr = Flight_list->next;
    ptr = D_List_find_id(Flight_list, id);
    if (ptr == NULL)
    {
        printf("未找到该航班，请重新输入。");
        return;
    }
    D_List_delete(Flight_list, id);
    printf("\t\t删除成功\n");
    D_List_file_print(Flight_list);
}
// 设定航班是否起飞
void set_flight_whetherfly_fly(F_list *Flight_list)
{
    system("clear");
    int id;
    printf("请输入要设定起飞的航班班次：");
    scanf("%d", &id);
    F_node *ptr = Flight_list->next;
    ptr = D_List_find_id(Flight_list, id);
    if (ptr == NULL)
    {
        printf("未找到该航班，请重新输入。");
        return;
    }
    if (ptr->data.whetherfly == 'n')
    {
        ptr->data.whetherfly = 'y';
        printf("\t\t设定成功\n");
        D_List_file_print(Flight_list);
        system("clear");
    }
    else
    {
        printf("该航班已起飞，请重新输入\n");
        return;
    }
}
// 设定航班是否降落
void set_flight_whetherfly_down(F_list *Flight_list)
{
    system("clear");
    int id;
    printf("请输入要设定起飞的航班班次：");
    scanf("%d", &id);
    F_node *ptr = Flight_list->next;
    ptr = D_List_find_id(Flight_list, id);
    if (ptr == NULL)
    {
        printf("未找到该航班，请重新输入。");
        return;
    }
    if (ptr->data.whetherfly == 'y')
    {
        ptr->data.whetherfly = 'n';
        printf("\t\t设定成功\n");
        D_List_file_print(Flight_list);
        system("clear");
    }
    else
    {
        printf("该航班已降落,请重新输入\n");
        return;
    }
}

// 设定航班
void set_flight(FlightSystem Flight_Sys, U_data log_data)
{
    system("clear");
    printf("=============================================设定航班=============================================\n");
    system("clear");
    while (1)
    {
        int flag = 0;
        flag = display_menu(title_3, option_3, 5);
        switch (flag)
        {
        case 1:
            add_flight(Flight_Sys.Flight_list);
            break;
        case 2:
            delete_flight(Flight_Sys.Flight_list);
            break;
        case 3:
            set_flight_whetherfly_fly(Flight_Sys.Flight_list);
            break;
        case 4:
            set_flight_whetherfly_down(Flight_Sys.Flight_list);
            break;
        case 5:
            return;
        default:
            printf("无效的选择，请重新输入。");
            return;
        }
    }
}

// ================================================================按航班班次修改航班
void modify_flight_id(F_list *Flight_list)
{
    int id;
    printf("请输入要修改的航班班次：");
    scanf("%d", &id);
    F_node *ptr = Flight_list->next;
    ptr = D_List_find_id(Flight_list, id);
    if (ptr == NULL)
    {
        printf("未找到该航班，请重新输入。");
        return;
    }

    printf("请选择要修改的内容：\n\t1. 航班班次\n\t2. 飞机机型\n\t3. 起点站\n\t4. 终点站\n\t5. 起飞时间\n\t6. 到达时间\n\t7. 飞行时间\n\t8. 票价\n\t9. 额定载客量\n\t0. 退出修改\n");
    int choice;
    scanf("%d", &choice);
    switch (choice)
    {
    case 1:
        printf("请输入新的航班班次：");
        scanf("%d", &ptr->data.id);
        break;
    case 2:
        printf("请输入新的飞机机型：");
        scanf("%s", ptr->data.flighttype);
        break;
    case 3:
        printf("请输入新的起点站：");
        scanf("%s", ptr->data.startcity);
        break;
    case 4:
        printf("请输入新的终点站：");
        scanf("%s", ptr->data.arrivecity);
        break;
    case 5:
        printf("请输入新的起飞时间（时：分）：");
        scanf("%d:%d", &ptr->data.starttime[0], &ptr->data.starttime[1]);
        break;
    case 6:
        printf("请输入新的到达时间（时：分）：");
        scanf("%d:%d", &ptr->data.arrivetime[0], &ptr->data.arrivetime[1]);
        break;
    case 7:
        printf("请输入新的飞行时间：");
        scanf("%s", ptr->data.flytime);
        break;
    case 8:
        printf("请输入新的票价：");
        scanf("%d", &ptr->data.value);
        break;
    case 9:
        printf("请输入新的额定载客量：");
        scanf("%d", &ptr->data.maxNUM);
        break;
    case 0:
        break;
    default:
        printf("输入错误，请重新输入。");
        return;
    }
    printf("修改成功！\n");
    D_List_file_print(Flight_list);
}
// ========================================================================修改普通用户
void modify_regular_users(U_list *list)
{
    U_node *ptr = list->next;
    S_List_print(list);
    printf("请输入你要修改的用户名:");
    char name[20];
    scanf("%s", name);
    ptr = S_List_find_name(list, name);
    if (ptr == NULL)
    {
        printf("未找到该用户，请重新输入。");
        return;
    }

    printf("请选择要修改的等级：\n\t1. 银卡用户\n\t2. 金卡用户\n\t3. 白金用户\n\t0. 不修改\n");
    int choice;
    scanf("%d", &choice);
    switch (choice)
    {
    case 1:
        ptr->data.grade = 3;
        S_List_File_insert(ptr->data, SILVER_FILE);
        S_List_delete_name(list, ptr->data.name);
        S_List_File_print(list, REGULAR_FILE);
        break;
    case 2:
        ptr->data.grade = 4;
        S_List_File_insert(ptr->data, GOLD_FILE);
        S_List_delete_name(list, ptr->data.name);
        S_List_File_print(list, REGULAR_FILE);
        break;
    case 3:
        ptr->data.grade = 5;
        S_List_File_insert(ptr->data, PLATINUM_FILE);
        S_List_delete_name(list, ptr->data.name);
        S_List_File_print(list, REGULAR_FILE);
        break;
    case 0:
        break;
    default:
        printf("输入错误，请重新输入。");
        return;
    }
    printf("修改成功！\n");
}

// ======================================================================增加超级用户
void add_admin(U_list *list)
{
    U_data data;
    printf("请输入要增加的用户名：");
    char name[20];
    scanf("%s", name);
    U_node *ptr = S_List_find_name(list, name);
    if (ptr != NULL)
    {
        printf("该用户已存在，请重新输入。\n");
        return;
    }
    printf("请输入要增加的用户密码：");
    char password[20];
    scanf("%s", password);
    strcpy(data.name, name);
    strcpy(data.passwd, password);
    data.grade = 1;
    S_List_insert(list, data, 1);
    S_List_File_print(list, ADMIN_FILE);
    printf("增加成功！\n");
}
// ======================================================================不同用户信息分别写入文件
void S_List_File_print_(U_list *list, FlightSystem Flight_Sys, char *name)
{
    U_node *ptr = S_List_find_name(list, name);
    if (ptr->data.grade == 2)
    {
        S_List_File_print(Flight_Sys.REGULAR_USER, REGULAR_FILE);
        return;
    }
    if (ptr->data.grade == 3)
    {
        S_List_File_print(Flight_Sys.SILVER_USER, SILVER_FILE);
        return;
    }
    if (ptr->data.grade == 4)
    {
        S_List_File_print(Flight_Sys.GOLD_USER, GOLD_FILE);
        return;
    }
    if (ptr->data.grade == 5)
    {
        S_List_File_print(Flight_Sys.PLATINUM_USER, PLATINUM_FILE);
        return;
    }
}
